
/*************************************************************/
/* macros for fast unpacking of integers of fixed bit length */
/*************************************************************/

#define BS 128 

/* supported bit lengths */
int cnum[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,20,32};

void unpack0(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i++)  p[i] = 0;
}


void unpack1(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 1)
  {
    p[0] = (w[0] >> 31);
    p[1] = (w[0] >> 30) & 1;
    p[2] = (w[0] >> 29) & 1;
    p[3] = (w[0] >> 28) & 1;
    p[4] = (w[0] >> 27) & 1;
    p[5] = (w[0] >> 26) & 1;
    p[6] = (w[0] >> 25) & 1;
    p[7] = (w[0] >> 24) & 1;
    p[8] = (w[0] >> 23) & 1;
    p[9] = (w[0] >> 22) & 1;
    p[10] = (w[0] >> 21) & 1;
    p[11] = (w[0] >> 20) & 1;
    p[12] = (w[0] >> 19) & 1;
    p[13] = (w[0] >> 18) & 1;
    p[14] = (w[0] >> 17) & 1;
    p[15] = (w[0] >> 16) & 1;
    p[16] = (w[0] >> 15) & 1;
    p[17] = (w[0] >> 14) & 1;
    p[18] = (w[0] >> 13) & 1;
    p[19] = (w[0] >> 12) & 1;
    p[20] = (w[0] >> 11) & 1;
    p[21] = (w[0] >> 10) & 1;
    p[22] = (w[0] >> 9) & 1;
    p[23] = (w[0] >> 8) & 1;
    p[24] = (w[0] >> 7) & 1;
    p[25] = (w[0] >> 6) & 1;
    p[26] = (w[0] >> 5) & 1;
    p[27] = (w[0] >> 4) & 1;
    p[28] = (w[0] >> 3) & 1;
    p[29] = (w[0] >> 2) & 1;
    p[30] = (w[0] >> 1) & 1;
    p[31] = (w[0]) & 1;
  }
}


void unpack2(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 2)
  {
    p[0] = (w[0] >> 30);
    p[1] = (w[0] >> 28) & 3;
    p[2] = (w[0] >> 26) & 3;
    p[3] = (w[0] >> 24) & 3;
    p[4] = (w[0] >> 22) & 3;
    p[5] = (w[0] >> 20) & 3;
    p[6] = (w[0] >> 18) & 3;
    p[7] = (w[0] >> 16) & 3;
    p[8] = (w[0] >> 14) & 3;
    p[9] = (w[0] >> 12) & 3;
    p[10] = (w[0] >> 10) & 3;
    p[11] = (w[0] >> 8) & 3;
    p[12] = (w[0] >> 6) & 3;
    p[13] = (w[0] >> 4) & 3;
    p[14] = (w[0] >> 2) & 3;
    p[15] = (w[0]) & 3;
    p[16] = (w[1] >> 30);
    p[17] = (w[1] >> 28) & 3;
    p[18] = (w[1] >> 26) & 3;
    p[19] = (w[1] >> 24) & 3;
    p[20] = (w[1] >> 22) & 3;
    p[21] = (w[1] >> 20) & 3;
    p[22] = (w[1] >> 18) & 3;
    p[23] = (w[1] >> 16) & 3;
    p[24] = (w[1] >> 14) & 3;
    p[25] = (w[1] >> 12) & 3;
    p[26] = (w[1] >> 10) & 3;
    p[27] = (w[1] >> 8) & 3;
    p[28] = (w[1] >> 6) & 3;
    p[29] = (w[1] >> 4) & 3;
    p[30] = (w[1] >> 2) & 3;
    p[31] = (w[1]) & 3;
  }
}


void unpack3(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 3) 
  { 
    p[0] = (w[0] >> 29);
    p[1] = (w[0] >> 26) & 7;
    p[2] = (w[0] >> 23) & 7;
    p[3] = (w[0] >> 20) & 7;
    p[4] = (w[0] >> 17) & 7;
    p[5] = (w[0] >> 14) & 7;
    p[6] = (w[0] >> 11) & 7;
    p[7] = (w[0] >> 8) & 7;
    p[8] = (w[0] >> 5) & 7;
    p[9] = (w[0] >> 2) & 7;
    p[10] = (w[0] << 1) & 7;
    p[10] |= (w[1] >> 31);
    p[11] = (w[1] >> 28) & 7;
    p[12] = (w[1] >> 25) & 7;
    p[13] = (w[1] >> 22) & 7;
    p[14] = (w[1] >> 19) & 7;
    p[15] = (w[1] >> 16) & 7;
    p[16] = (w[1] >> 13) & 7;
    p[17] = (w[1] >> 10) & 7;
    p[18] = (w[1] >> 7) & 7;
    p[19] = (w[1] >> 4) & 7;
    p[20] = (w[1] >> 1) & 7;
    p[21] = (w[1] << 2) & 7;
    p[21] |= (w[2] >> 30);
    p[22] = (w[2] >> 27) & 7;
    p[23] = (w[2] >> 24) & 7;
    p[24] = (w[2] >> 21) & 7;
    p[25] = (w[2] >> 18) & 7;
    p[26] = (w[2] >> 15) & 7;
    p[27] = (w[2] >> 12) & 7;
    p[28] = (w[2] >> 9) & 7;
    p[29] = (w[2] >> 6) & 7;
    p[30] = (w[2] >> 3) & 7;
    p[31] = (w[2]) & 7;
  }
}


void unpack4(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 4) 
  { 
    p[0] = (w[0] >> 28);
    p[1] = (w[0] >> 24) & 15;
    p[2] = (w[0] >> 20) & 15;
    p[3] = (w[0] >> 16) & 15;
    p[4] = (w[0] >> 12) & 15;
    p[5] = (w[0] >> 8) & 15;
    p[6] = (w[0] >> 4) & 15;
    p[7] = (w[0]) & 15;
    p[8] = (w[1] >> 28);
    p[9] = (w[1] >> 24) & 15;
    p[10] = (w[1] >> 20) & 15;
    p[11] = (w[1] >> 16) & 15;
    p[12] = (w[1] >> 12) & 15;
    p[13] = (w[1] >> 8) & 15;
    p[14] = (w[1] >> 4) & 15;
    p[15] = (w[1]) & 15;
    p[16] = (w[2] >> 28);
    p[17] = (w[2] >> 24) & 15;
    p[18] = (w[2] >> 20) & 15;
    p[19] = (w[2] >> 16) & 15;
    p[20] = (w[2] >> 12) & 15;
    p[21] = (w[2] >> 8) & 15;
    p[22] = (w[2] >> 4) & 15;
    p[23] = (w[2]) & 15;
    p[24] = (w[3] >> 28);
    p[25] = (w[3] >> 24) & 15;
    p[26] = (w[3] >> 20) & 15;
    p[27] = (w[3] >> 16) & 15;
    p[28] = (w[3] >> 12) & 15;
    p[29] = (w[3] >> 8) & 15;
    p[30] = (w[3] >> 4) & 15;
    p[31] = (w[3]) & 15;
  }
}


void unpack5(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 5) 
  { 
    p[0] = (w[0] >> 27);
    p[1] = (w[0] >> 22) & 31;
    p[2] = (w[0] >> 17) & 31;
    p[3] = (w[0] >> 12) & 31;
    p[4] = (w[0] >> 7) & 31;
    p[5] = (w[0] >> 2) & 31;
    p[6] = (w[0] << 3) & 31;
    p[6] |= (w[1] >> 29);
    p[7] = (w[1] >> 24) & 31;
    p[8] = (w[1] >> 19) & 31;
    p[9] = (w[1] >> 14) & 31;
    p[10] = (w[1] >> 9) & 31;
    p[11] = (w[1] >> 4) & 31;
    p[12] = (w[1] << 1) & 31;
    p[12] |= (w[2] >> 31);
    p[13] = (w[2] >> 26) & 31;
    p[14] = (w[2] >> 21) & 31;
    p[15] = (w[2] >> 16) & 31;
    p[16] = (w[2] >> 11) & 31;
    p[17] = (w[2] >> 6) & 31;
    p[18] = (w[2] >> 1) & 31;
    p[19] = (w[2] << 4) & 31;
    p[19] |= (w[3] >> 28);
    p[20] = (w[3] >> 23) & 31;
    p[21] = (w[3] >> 18) & 31;
    p[22] = (w[3] >> 13) & 31;
    p[23] = (w[3] >> 8) & 31;
    p[24] = (w[3] >> 3) & 31;
    p[25] = (w[3] << 2) & 31;
    p[25] |= (w[4] >> 30);
    p[26] = (w[4] >> 25) & 31;
    p[27] = (w[4] >> 20) & 31;
    p[28] = (w[4] >> 15) & 31;
    p[29] = (w[4] >> 10) & 31;
    p[30] = (w[4] >> 5) & 31;
    p[31] = (w[4]) & 31;
  }
}


void unpack6(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 6) 
  { 
    p[0] = (w[0] >> 26);
    p[1] = (w[0] >> 20) & 63;
    p[2] = (w[0] >> 14) & 63;
    p[3] = (w[0] >> 8) & 63;
    p[4] = (w[0] >> 2) & 63;
    p[5] = (w[0] << 4) & 63;
    p[5] |= (w[1] >> 28);
    p[6] = (w[1] >> 22) & 63;
    p[7] = (w[1] >> 16) & 63;
    p[8] = (w[1] >> 10) & 63;
    p[9] = (w[1] >> 4) & 63;
    p[10] = (w[1] << 2) & 63;
    p[10] |= (w[2] >> 30);
    p[11] = (w[2] >> 24) & 63;
    p[12] = (w[2] >> 18) & 63;
    p[13] = (w[2] >> 12) & 63;
    p[14] = (w[2] >> 6) & 63;
    p[15] = (w[2]) & 63;
    p[16] = (w[3] >> 26);
    p[17] = (w[3] >> 20) & 63;
    p[18] = (w[3] >> 14) & 63;
    p[19] = (w[3] >> 8) & 63;
    p[20] = (w[3] >> 2) & 63;
    p[21] = (w[3] << 4) & 63;
    p[21] |= (w[4] >> 28);
    p[22] = (w[4] >> 22) & 63;
    p[23] = (w[4] >> 16) & 63;
    p[24] = (w[4] >> 10) & 63;
    p[25] = (w[4] >> 4) & 63;
    p[26] = (w[4] << 2) & 63;
    p[26] |= (w[5] >> 30);
    p[27] = (w[5] >> 24) & 63;
    p[28] = (w[5] >> 18) & 63;
    p[29] = (w[5] >> 12) & 63;
    p[30] = (w[5] >> 6) & 63;
    p[31] = (w[5]) & 63;
  }
}


void unpack7(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 7) 
  { 
    p[0] = (w[0] >> 25);
    p[1] = (w[0] >> 18) & 127;
    p[2] = (w[0] >> 11) & 127;
    p[3] = (w[0] >> 4) & 127;
    p[4] = (w[0] << 3) & 127;
    p[4] |= (w[1] >> 29);
    p[5] = (w[1] >> 22) & 127;
    p[6] = (w[1] >> 15) & 127;
    p[7] = (w[1] >> 8) & 127;
    p[8] = (w[1] >> 1) & 127;
    p[9] = (w[1] << 6) & 127;
    p[9] |= (w[2] >> 26);
    p[10] = (w[2] >> 19) & 127;
    p[11] = (w[2] >> 12) & 127;
    p[12] = (w[2] >> 5) & 127;
    p[13] = (w[2] << 2) & 127;
    p[13] |= (w[3] >> 30);
    p[14] = (w[3] >> 23) & 127;
    p[15] = (w[3] >> 16) & 127;
    p[16] = (w[3] >> 9) & 127;
    p[17] = (w[3] >> 2) & 127;
    p[18] = (w[3] << 5) & 127;
    p[18] |= (w[4] >> 27);
    p[19] = (w[4] >> 20) & 127;
    p[20] = (w[4] >> 13) & 127;
    p[21] = (w[4] >> 6) & 127;
    p[22] = (w[4] << 1) & 127;
    p[22] |= (w[5] >> 31);
    p[23] = (w[5] >> 24) & 127;
    p[24] = (w[5] >> 17) & 127;
    p[25] = (w[5] >> 10) & 127;
    p[26] = (w[5] >> 3) & 127;
    p[27] = (w[5] << 4) & 127;
    p[27] |= (w[6] >> 28);
    p[28] = (w[6] >> 21) & 127;
    p[29] = (w[6] >> 14) & 127;
    p[30] = (w[6] >> 7) & 127;
    p[31] = (w[6]) & 127;
  }
}


void unpack8(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 8) 
  { 
    p[0] = (w[0] >> 24);
    p[1] = (w[0] >> 16) & 255;
    p[2] = (w[0] >> 8) & 255;
    p[3] = (w[0]) & 255;
    p[4] = (w[1] >> 24);
    p[5] = (w[1] >> 16) & 255;
    p[6] = (w[1] >> 8) & 255;
    p[7] = (w[1]) & 255;
    p[8] = (w[2] >> 24);
    p[9] = (w[2] >> 16) & 255;
    p[10] = (w[2] >> 8) & 255;
    p[11] = (w[2]) & 255;
    p[12] = (w[3] >> 24);
    p[13] = (w[3] >> 16) & 255;
    p[14] = (w[3] >> 8) & 255;
    p[15] = (w[3]) & 255;
    p[16] = (w[4] >> 24);
    p[17] = (w[4] >> 16) & 255;
    p[18] = (w[4] >> 8) & 255;
    p[19] = (w[4]) & 255;
    p[20] = (w[5] >> 24);
    p[21] = (w[5] >> 16) & 255;
    p[22] = (w[5] >> 8) & 255;
    p[23] = (w[5]) & 255;
    p[24] = (w[6] >> 24);
    p[25] = (w[6] >> 16) & 255;
    p[26] = (w[6] >> 8) & 255;
    p[27] = (w[6]) & 255;
    p[28] = (w[7] >> 24);
    p[29] = (w[7] >> 16) & 255;
    p[30] = (w[7] >> 8) & 255;
    p[31] = (w[7]) & 255;
  }
}


void unpack9(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 9)
  {
    p[0] = (w[0] >> 23);
    p[1] = (w[0] >> 14) & 511;
    p[2] = (w[0] >> 5) & 511;
    p[3] = (w[0] << 4) & 511;
    p[3] |= (w[1] >> 28);
    p[4] = (w[1] >> 19) & 511;
    p[5] = (w[1] >> 10) & 511;
    p[6] = (w[1] >> 1) & 511;
    p[7] = (w[1] << 8) & 511;
    p[7] |= (w[2] >> 24);
    p[8] = (w[2] >> 15) & 511;
    p[9] = (w[2] >> 6) & 511;
    p[10] = (w[2] << 3) & 511;
    p[10] |= (w[3] >> 29);
    p[11] = (w[3] >> 20) & 511;
    p[12] = (w[3] >> 11) & 511;
    p[13] = (w[3] >> 2) & 511;
    p[14] = (w[3] << 7) & 511;
    p[14] |= (w[4] >> 25);
    p[15] = (w[4] >> 16) & 511;
    p[16] = (w[4] >> 7) & 511;
    p[17] = (w[4] << 2) & 511;
    p[17] |= (w[5] >> 30);
    p[18] = (w[5] >> 21) & 511;
    p[19] = (w[5] >> 12) & 511;
    p[20] = (w[5] >> 3) & 511;
    p[21] = (w[5] << 6) & 511;
    p[21] |= (w[6] >> 26);
    p[22] = (w[6] >> 17) & 511;
    p[23] = (w[6] >> 8) & 511;
    p[24] = (w[6] << 1) & 511;
    p[24] |= (w[7] >> 31);
    p[25] = (w[7] >> 22) & 511;
    p[26] = (w[7] >> 13) & 511;
    p[27] = (w[7] >> 4) & 511;
    p[28] = (w[7] << 5) & 511;
    p[28] |= (w[8] >> 27);
    p[29] = (w[8] >> 18) & 511;
    p[30] = (w[8] >> 9) & 511;
    p[31] = (w[8]) & 511;
  }
}


void unpack10(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 10) 
  { 
    p[0] = (w[0] >> 22);
    p[1] = (w[0] >> 12) & 1023;
    p[2] = (w[0] >> 2) & 1023;
    p[3] = (w[0] << 8) & 1023;
    p[3] |= (w[1] >> 24);
    p[4] = (w[1] >> 14) & 1023;
    p[5] = (w[1] >> 4) & 1023;
    p[6] = (w[1] << 6) & 1023;
    p[6] |= (w[2] >> 26);
    p[7] = (w[2] >> 16) & 1023;
    p[8] = (w[2] >> 6) & 1023;
    p[9] = (w[2] << 4) & 1023;
    p[9] |= (w[3] >> 28);
    p[10] = (w[3] >> 18) & 1023;
    p[11] = (w[3] >> 8) & 1023;
    p[12] = (w[3] << 2) & 1023;
    p[12] |= (w[4] >> 30);
    p[13] = (w[4] >> 20) & 1023;
    p[14] = (w[4] >> 10) & 1023;
    p[15] = (w[4]) & 1023;
    p[16] = (w[5] >> 22);
    p[17] = (w[5] >> 12) & 1023;
    p[18] = (w[5] >> 2) & 1023;
    p[19] = (w[5] << 8) & 1023;
    p[19] |= (w[6] >> 24);
    p[20] = (w[6] >> 14) & 1023;
    p[21] = (w[6] >> 4) & 1023;
    p[22] = (w[6] << 6) & 1023;
    p[22] |= (w[7] >> 26);
    p[23] = (w[7] >> 16) & 1023;
    p[24] = (w[7] >> 6) & 1023;
    p[25] = (w[7] << 4) & 1023;
    p[25] |= (w[8] >> 28);
    p[26] = (w[8] >> 18) & 1023;
    p[27] = (w[8] >> 8) & 1023;
    p[28] = (w[8] << 2) & 1023;
    p[28] |= (w[9] >> 30);
    p[29] = (w[9] >> 20) & 1023;
    p[30] = (w[9] >> 10) & 1023;
    p[31] = (w[9]) & 1023;
  }
}


void unpack11(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 11) 
  { 
    p[0] = (w[0] >> 21);
    p[1] = (w[0] >> 10) & 2047;
    p[2] = (w[0] << 1) & 2047;
    p[2] |= (w[1] >> 31);
    p[3] = (w[1] >> 20) & 2047;
    p[4] = (w[1] >> 9) & 2047;
    p[5] = (w[1] << 2) & 2047;
    p[5] |= (w[2] >> 30);
    p[6] = (w[2] >> 19) & 2047;
    p[7] = (w[2] >> 8) & 2047;
    p[8] = (w[2] << 3) & 2047;
    p[8] |= (w[3] >> 29);
    p[9] = (w[3] >> 18) & 2047;
    p[10] = (w[3] >> 7) & 2047;
    p[11] = (w[3] << 4) & 2047;
    p[11] |= (w[4] >> 28);
    p[12] = (w[4] >> 17) & 2047;
    p[13] = (w[4] >> 6) & 2047;
    p[14] = (w[4] << 5) & 2047;
    p[14] |= (w[5] >> 27);
    p[15] = (w[5] >> 16) & 2047;
    p[16] = (w[5] >> 5) & 2047;
    p[17] = (w[5] << 6) & 2047;
    p[17] |= (w[6] >> 26);
    p[18] = (w[6] >> 15) & 2047;
    p[19] = (w[6] >> 4) & 2047;
    p[20] = (w[6] << 7) & 2047;
    p[20] |= (w[7] >> 25);
    p[21] = (w[7] >> 14) & 2047;
    p[22] = (w[7] >> 3) & 2047;
    p[23] = (w[7] << 8) & 2047;
    p[23] |= (w[8] >> 24);
    p[24] = (w[8] >> 13) & 2047;
    p[25] = (w[8] >> 2) & 2047;
    p[26] = (w[8] << 9) & 2047;
    p[26] |= (w[9] >> 23);
    p[27] = (w[9] >> 12) & 2047;
    p[28] = (w[9] >> 1) & 2047;
    p[29] = (w[9] << 10) & 2047;
    p[29] |= (w[10] >> 22);
    p[30] = (w[10] >> 11) & 2047;
    p[31] = (w[10]) & 2047;
  }
}


void unpack12(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 12) 
  { 
    p[0] = (w[0] >> 20);
    p[1] = (w[0] >> 8) & 4095;
    p[2] = (w[0] << 4) & 4095;
    p[2] |= (w[1] >> 28);
    p[3] = (w[1] >> 16) & 4095;
    p[4] = (w[1] >> 4) & 4095;
    p[5] = (w[1] << 8) & 4095;
    p[5] |= (w[2] >> 24);
    p[6] = (w[2] >> 12) & 4095;
    p[7] = (w[2]) & 4095;
    p[8] = (w[3] >> 20);
    p[9] = (w[3] >> 8) & 4095;
    p[10] = (w[3] << 4) & 4095;
    p[10] |= (w[4] >> 28);
    p[11] = (w[4] >> 16) & 4095;
    p[12] = (w[4] >> 4) & 4095;
    p[13] = (w[4] << 8) & 4095;
    p[13] |= (w[5] >> 24);
    p[14] = (w[5] >> 12) & 4095;
    p[15] = (w[5]) & 4095;
    p[16] = (w[6] >> 20);
    p[17] = (w[6] >> 8) & 4095;
    p[18] = (w[6] << 4) & 4095;
    p[18] |= (w[7] >> 28);
    p[19] = (w[7] >> 16) & 4095;
    p[20] = (w[7] >> 4) & 4095;
    p[21] = (w[7] << 8) & 4095;
    p[21] |= (w[8] >> 24);
    p[22] = (w[8] >> 12) & 4095;
    p[23] = (w[8]) & 4095;
    p[24] = (w[9] >> 20);
    p[25] = (w[9] >> 8) & 4095;
    p[26] = (w[9] << 4) & 4095;
    p[26] |= (w[10] >> 28);
    p[27] = (w[10] >> 16) & 4095;
    p[28] = (w[10] >> 4) & 4095;
    p[29] = (w[10] << 8) & 4095;
    p[29] |= (w[11] >> 24);
    p[30] = (w[11] >> 12) & 4095;
    p[31] = (w[11]) & 4095;
  }
}


void unpack13(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 13) 
  { 
    p[0] = (w[0] >> 19);
    p[1] = (w[0] >> 6) & 8191;
    p[2] = (w[0] << 7) & 8191;
    p[2] |= (w[1] >> 25);
    p[3] = (w[1] >> 12) & 8191;
    p[4] = (w[1] << 1) & 8191;
    p[4] |= (w[2] >> 31);
    p[5] = (w[2] >> 18) & 8191;
    p[6] = (w[2] >> 5) & 8191;
    p[7] = (w[2] << 8) & 8191;
    p[7] |= (w[3] >> 24);
    p[8] = (w[3] >> 11) & 8191;
    p[9] = (w[3] << 2) & 8191;
    p[9] |= (w[4] >> 30);
    p[10] = (w[4] >> 17) & 8191;
    p[11] = (w[4] >> 4) & 8191;
    p[12] = (w[4] << 9) & 8191;
    p[12] |= (w[5] >> 23);
    p[13] = (w[5] >> 10) & 8191;
    p[14] = (w[5] << 3) & 8191;
    p[14] |= (w[6] >> 29);
    p[15] = (w[6] >> 16) & 8191;
    p[16] = (w[6] >> 3) & 8191;
    p[17] = (w[6] << 10) & 8191;
    p[17] |= (w[7] >> 22);
    p[18] = (w[7] >> 9) & 8191;
    p[19] = (w[7] << 4) & 8191;
    p[19] |= (w[8] >> 28);
    p[20] = (w[8] >> 15) & 8191;
    p[21] = (w[8] >> 2) & 8191;
    p[22] = (w[8] << 11) & 8191;
    p[22] |= (w[9] >> 21);
    p[23] = (w[9] >> 8) & 8191;
    p[24] = (w[9] << 5) & 8191;
    p[24] |= (w[10] >> 27);
    p[25] = (w[10] >> 14) & 8191;
    p[26] = (w[10] >> 1) & 8191;
    p[27] = (w[10] << 12) & 8191;
    p[27] |= (w[11] >> 20);
    p[28] = (w[11] >> 7) & 8191;
    p[29] = (w[11] << 6) & 8191;
    p[29] |= (w[12] >> 26);
    p[30] = (w[12] >> 13) & 8191;
    p[31] = (w[12]) & 8191;
  }
}


void unpack16(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 16) 
  { 
    p[0] = (w[0] >> 16);
    p[1] = (w[0]) & 65535;
    p[2] = (w[1] >> 16);
    p[3] = (w[1]) & 65535;
    p[4] = (w[2] >> 16);
    p[5] = (w[2]) & 65535;
    p[6] = (w[3] >> 16);
    p[7] = (w[3]) & 65535;
    p[8] = (w[4] >> 16);
    p[9] = (w[4]) & 65535;
    p[10] = (w[5] >> 16);
    p[11] = (w[5]) & 65535;
    p[12] = (w[6] >> 16);
    p[13] = (w[6]) & 65535;
    p[14] = (w[7] >> 16);
    p[15] = (w[7]) & 65535;
    p[16] = (w[8] >> 16);
    p[17] = (w[8]) & 65535;
    p[18] = (w[9] >> 16);
    p[19] = (w[9]) & 65535;
    p[20] = (w[10] >> 16);
    p[21] = (w[10]) & 65535;
    p[22] = (w[11] >> 16);
    p[23] = (w[11]) & 65535;
    p[24] = (w[12] >> 16);
    p[25] = (w[12]) & 65535;
    p[26] = (w[13] >> 16);
    p[27] = (w[13]) & 65535;
    p[28] = (w[14] >> 16);
    p[29] = (w[14]) & 65535;
    p[30] = (w[15] >> 16);
    p[31] = (w[15]) & 65535;
  }
}


void unpack20(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 20) 
  { 
    p[0] = (w[0] >> 12);
    p[1] = (w[0] << 8) & ((1<<20)-1);
    p[1] |= (w[1] >> 24);
    p[2] = (w[1] >> 4) & ((1<<20)-1);
    p[3] = (w[1] << 16) & ((1<<20)-1);
    p[3] |= (w[2] >> 16);
    p[4] = (w[2] << 4) & ((1<<20)-1);
    p[4] |= (w[3] >> 28);
    p[5] = (w[3] >> 8) & ((1<<20)-1);
    p[6] = (w[3] << 12) & ((1<<20)-1);
    p[6] |= (w[4] >> 20);
    p[7] = (w[4]) & ((1<<20)-1);
    p[8] = (w[5] >> 12);
    p[9] = (w[5] << 8) & ((1<<20)-1);
    p[9] |= (w[6] >> 24);
    p[10] = (w[6] >> 4) & ((1<<20)-1);
    p[11] = (w[6] << 16) & ((1<<20)-1);
    p[11] |= (w[7] >> 16);
    p[12] = (w[7] << 4) & ((1<<20)-1);
    p[12] |= (w[8] >> 28);
    p[13] = (w[8] >> 8) & ((1<<20)-1);
    p[14] = (w[8] << 12) & ((1<<20)-1);
    p[14] |= (w[9] >> 20);
    p[15] = (w[9]) & ((1<<20)-1);
    p[16] = (w[10] >> 12);
    p[17] = (w[10] << 8) & ((1<<20)-1);
    p[17] |= (w[11] >> 24);
    p[18] = (w[11] >> 4) & ((1<<20)-1);
    p[19] = (w[11] << 16) & ((1<<20)-1);
    p[19] |= (w[12] >> 16);
    p[20] = (w[12] << 4) & ((1<<20)-1);
    p[20] |= (w[13] >> 28);
    p[21] = (w[13] >> 8) & ((1<<20)-1);
    p[22] = (w[13] << 12) & ((1<<20)-1);
    p[22] |= (w[14] >> 20);
    p[23] = (w[14]) & ((1<<20)-1);
    p[24] = (w[15] >> 12);
    p[25] = (w[15] << 8) & ((1<<20)-1);
    p[25] |= (w[16] >> 24);
    p[26] = (w[16] >> 4) & ((1<<20)-1);
    p[27] = (w[16] << 16) & ((1<<20)-1);
    p[27] |= (w[17] >> 16);
    p[28] = (w[17] << 4) & ((1<<20)-1);
    p[28] |= (w[18] >> 28);
    p[29] = (w[18] >> 8) & ((1<<20)-1);
    p[30] = (w[18] << 12) & ((1<<20)-1);
    p[30] |= (w[19] >> 20);
    p[31] = (w[19]) & ((1<<20)-1);
  }
}


static void unpack32(unsigned int *p, unsigned int *w)
{
  int i;

  for (i = 0; i < BS; i += 32, p += 32, w += 32) 
  { 
    p[0] = w[0];
    p[1] = w[1];
    p[2] = w[2];
    p[3] = w[3];
    p[4] = w[4];
    p[5] = w[5];
    p[6] = w[6];
    p[7] = w[7];
    p[8] = w[8];
    p[9] = w[9];
    p[10] = w[10];
    p[11] = w[11];
    p[12] = w[12];
    p[13] = w[13];
    p[14] = w[14];
    p[15] = w[15];
    p[16] = w[16];
    p[17] = w[17];
    p[18] = w[18];
    p[19] = w[19];
    p[20] = w[20];
    p[21] = w[21];
    p[22] = w[22];
    p[23] = w[23];
    p[24] = w[24];
    p[25] = w[25];
    p[26] = w[26];
    p[27] = w[27];
    p[28] = w[28];
    p[29] = w[29];
    p[30] = w[30];
    p[31] = w[31];
  }
}


typedef void (*pf)(unsigned int *p, unsigned int *w);
pf unpack[17] = {unpack0, unpack1, unpack2, unpack3, unpack4, unpack5, 
                 unpack6, unpack7, unpack8, unpack9, unpack10, unpack11, 
                 unpack12, unpack13, unpack16, unpack20, unpack32};

